//引入express模块
const express = require('express')
//path模块是node.js中处理路径的核心模块。可以很方便的处理关于文件路径的问题。
const path = require('path')

//创建应用对象
const app = express()


//处理body请求体的中间件
app.use(express.urlencoded()) //处理form表单格式
app.use(express.json()) //处理json字符串格式

//手动处理body请求的中间件
//是中间件可以接收任何请求
/* app.use((req,res,next)=>{
    let dataStr=''
    req.on('data',(chunk)=>{
        // console.log(chunk.toString());  //name=nih&age=nn  这个是查询字符串格式(对于后端来说是form表单格式)
        dataStr+=chunk.toString()
    })
    req.on('end',()=>{
        //方法1
        // const o={}
        // // console.log(dataStr);
        // //以&来截取,得到一个数组
        // dataStr.split('&')  //['name=nn','age=11']
        // dataStr.split('&').forEach(item=>{
        //     const [key,value]=item.split('=')//['name','nn']
        //     o[key]=value
        // })
        // console.log(o);

        //方法2
        //累加 万物皆可reducs
        //reducs的回调函数中的第一个值是上一次的返回值或者初始值,第二个值是当前的值(相当于item)
        const data= dataStr.split('&').reduce((prev,current)=>{
            const [key,value]=current.split('=');
            prev[key]=value
            return prev
        },{})
        console.log(data,'data');   //{ name: 'nih', age: 'nn' } data
        //在中间件中,得到请求体body的值并处理为一个对象  添加给req的body属性上
        req.body=data

        next()
    })
    
    
}) */

//处理跨域请求的中间件(方便OPTIONS请求进来获取权限)
app.use((req,res,next)=>{
    //所有的请求都允许访问跨域
    // res.set('Access-Control-Allow-Origin','*')
    //设置允许跨域的IP地址
    // res.set('Access-Control-Allow-Origin','http://127.0.0.1:5500')
    // res.set('Access-Control-Allow-Origin','http://127.0.0.1:500')


    //设置允许跨域的地址合集
    const allowAdd = ["http://127.0.0.1:5500", "http://127.0.0.1:57556", "http://127.0.0.1:57557", "http://127.0.0.1:57558"]
    //includes方法调用如果在集合中找到该值，则此方法返回true，否则返回false。
    console.log(req.headers.origin); //拿到请求的来源地址
    if (allowAdd.includes(req.headers.origin)) {
        res.set('Access-Control-Allow-Origin', req.headers.origin)
        res.set('Access-Control-Allow-Headers','token')//这个设置的是某个请求头key的值
    }


    next()
})

//cors跨域(预检请求options进不去,因为这个是get请求)
app.get('/userInfo', (req, res) => {



    res.send({
        code: 10000,
        msg: "查询成功",
        data: {
            name: "李博",
            age: 18,
            sex: "男"
        }
    })
})


//jsonp接口请求
app.get('/getUser', (req, res) => {
    // console.log(req.query);
    const {
        userId,
        cb
    } = req.query

    const data = {
        code: 10000,
        msg: '查询成功',
        data: {
            name: 'zhang',
            age: 18,
            sex: '男'
        }
    }
    //res.send(`${cb}(${JSON.stringify(data)})`)     会隐式转换成       res.send(`callback([object object]))    所以直接把对象data直接转换成字符串格式JSON.stringify()的字符串
    res.send(`${cb}(${JSON.stringify(data)})`)
})

//查询学生信息接口  query传参
app.get('/user', (req, res) => {
    //在没有处理的跨域请求是可以发送到服务器的,但是在访问器响应的时候,浏览器拒绝接受
    console.log(1);
    const {
        userId
    } = req.query //{ wd: 'wuhan', tel: '123456' }   这个是解构赋值选择对象身上的userId属性
    // console.log(res.query);

    //查询失败 响应
    if (userId !== '001') {
        //return作用  先执行return后面的语句 然后退出函数
        return res.send({
            code: 10001,
            msg: '查失败',
            data: null
        })
    }

    //查询成功 响应
    res.send({
        code: 10000,
        msg: '查询成功',
        data: {
            name: 'zhang',
            age: 18,
            sex: '男'
        }
    })

})

//查询接口  path传参
app.get('/userInfo/:userId', (req, res) => {
    // console.log(req.params);        
    const {
        userId
    } = req.params //{ userId: '001' }

    //查询失败 响应
    if (userId !== '001') {
        //return作用  先执行return后面的语句 然后退出函数
        return res.send({
            code: 10001,
            msg: '查失败',
            data: null
        })
    }

    //查询成功 响应
    res.send({
        code: 10000,
        msg: '查询成功',
        data: {
            name: 'zhang',
            age: 18,
            sex: '男'
        }
    })
})

app.post('/adduser', (req, res) => {
    // console.log('adduser');
    // console.log(req.body);
    const {
        name,
        age,
        sex
    } = req.body
    if (!name || !age || !sex) {
        return res.send({
            code: 10001,
            mes: '添加失败',
            data: null
        })
    }
    res.send({
        code: 10000,
        mes: '添加成功',
        data: null
    })
})

//搭建路由  静态资源布署接口
app.get('/1', (req, res) => {

    //resolve() 返回绝对路径
    const filepath = path.resolve(__dirname, './1.axios的基础使用.html')

    //做出响应
    res.sendFile(filepath)

})
//设置端口
app.listen(8550, () => {
    console.log('服务器启动成功');
})